Java 多线程编程之七:死锁(附源代码)
源代码下载
多线程编程中,线程死锁也是一个比较有趣的问题。然而死锁发生的可能性很小,正因如此,大家可能对此不是很熟悉。但是死锁并不是不重要,因为它确确实实存在着,随时会出现在我们的程序之中。很多朋友面试的时候都遇到过这样类似的一个编程题:使用 Java 写一个死锁。问题不是很难,但是由于大家现实中处理的比较少,还真难住了一部分人。本文列举了一个简单但又不失为经典的死锁的源代码,并解释了死锁发生的原因。相信读者看过之后对死锁会有更进一步的认识!
死锁发生的原因一般是两个对象的锁相互等待造成的。比如线程 1 先拿到了对象 A 的对象锁,线程 2 先拿到了对象 B 的对象锁。线程 1 这时候要求拿到对象 B 的对象锁,因为对象 B 的对象锁暂时被线程 2 所持有,所以线程 1 只能抱着对象 A 的对象锁等待线程 2 释放掉对象 B 的对象锁。而如果这个时候,持有对象 B 的对象锁的线程 2 要求访问对象 A 的对象锁,因为对象 A 的对象锁暂时被线程 1 所持有,所以线程 2 只能抱着对象 B 的对象锁等待线程 1 释放掉对象 A 的对象锁。这个时候两个线程就陷入了互相等待的僵局之中。程序就进入了死锁的状态,除非你手工停掉这个程序,否则它将永久地僵持下去。
是不是有点绕?嘿嘿,如果你弄